////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                                            //
//                                                         WNProject                                                          //
//                                                                                                                            //
//            This file is distributed under the BSD 2-Clause open source license. See License.txt for details.               //
//                                                                                                                            //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#pragma once

#ifndef __WN_CONCURRENCY_CALL_ONCE_H__
#define __WN_CONCURRENCY_CALL_ONCE_H__

#include "WNCore/inc/WNTypes.h"

namespace WNConcurrency {
    class WNOnceFlag {
    public:
        WNOnceFlag();

        WN_VOID Reset();

    public:
        template <typename Function> friend WN_VOID WNCallOnce(WNOnceFlag& _flag, Function _function);

    private:
        WNOnceFlag(const WNOnceFlag&) {}
        WNOnceFlag& operator = (const WNOnceFlag&) {}

    private:
        WN_ATOM_T mFlag;
    };

    template <typename Function>
    WN_VOID WNCallOnce(WNOnceFlag& _flag, Function _function);
}

#include "WNConcurrency/inc/WNCallOnce.inl"

#endif // __WN_CONCURRENCY_CALL_ONCE_H__
